import java.util.*;

public class Cell {
    private int value;
    private TreeSet possibleValues;
    public final int HIGHEST = Board.SIZE;
    private boolean certain;
    private static Integer[] ints = null;

    public Cell ()
    {
    	if (ints == null) {
    		ints = new Integer[HIGHEST+1];
    		for (int i = 0; i <= HIGHEST; i++)
    			ints[i] = new Integer(i);
    	}
        value = 0;
        possibleValues = new TreeSet();
        for (int i = 1; i <= HIGHEST; i ++) {
            possibleValues.add(ints[i]);
        }
        certain = false;
    }

    public Cell (int v)
    {
        value = v;
        certain = true;
        possibleValues = new TreeSet();
        possibleValues.add(ints[v]);
    }

    public Cell (Cell other)
    {
        value = other.value;
        certain = other.certain;
        possibleValues = new TreeSet(other.possibleValues);
    }

    public void setValue(int v) {
        if (v < 1 || v > HIGHEST) {
            return;
        }
        value = v;
        possibleValues.clear();
        possibleValues.add(ints[v]);
    }
    
    public void setPermanentValue(int v) {
        if (v < 1 || v > HIGHEST) {
            return;
        }
        value = v;
        makeCertain();
    }
    
	public void resetPossibilities()
	{
		for (int i = 1; i <= HIGHEST; i ++) {
	        possibleValues.add(ints[i]);
	    }
	}

    public void clearPermanentValue() {
        value = 0;
        makeUncertain();
    }
    
    public int getValue() {
        return value;
    }

    public boolean possibleValue(int v) {
        if (v < 1 || v > HIGHEST)
            return false;
        return possibleValues.contains(ints[v]);
    }

    public void invalidate(int v) {
        possibleValues.remove(ints[v]);
    }
  
    public int howManyPossible()
    {
        return possibleValues.size();
    }
  
    public boolean isCertain()
    {
        return certain;
    }
  
    public void makeCertain()
    {
        certain = true;
    }

    public void makeUncertain()
    {
        certain = false;
    }

    public Iterator iterator()
    {
        return possibleValues.iterator();
    }
}
